#ifndef PLUGINHANDLER_H
#define PLUGINHANDLER_H

#include "PanGuPlugin.h"
#include <QObject>
#include <QVariant>
#include <QQmlComponent>
#include <QSet>

class PluginHandler : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief   : 添加新的插件进程序。
     * @param   : qurl Url链接
     * @author  : BinWatson
     * @version : v1.0
     * @date    : 2022-06-05 10:41:19
     * @details : 供AddPluginButton.qml页面调用
     */
    Q_INVOKABLE void addNewPlugin(const QVariant& qurl);

    /**
     * @brief   : 加载页面
     * @param   : index 需要加载的页面下标
     * @author  : BinWatson
     * @version : v1.0
     * @date    : 2022-06-05 10:43:31
     * @details : 供ChoiceWindow.qml页面调用
     */
    Q_INVOKABLE void loadPage(const int btnIndex);

    /**
     * @brief   : 释放页面
     * @param   : headerIndex 导航条的索引
     * @author  : BinWatson
     * @version : v1.2
     * @date    : 2022-06-06 14:32:26
     * @details : 供Header.qml页面调用
     */
    Q_INVOKABLE void releasePage(const int headerIndex);

    /**
     * @brief   : 切换头部时时调用
     * @param   : headerIndex 导航条的索引
     * @author  : BinWatson
     * @version : v1.0
     * @date    : 2022-06-24 10:58:28
     * @details : 供Header.qml页面调用
     */
    Q_INVOKABLE void changeHeader(const int headerIndex);

    /**
     * @brief   : 切换页面时调用
     * @param   : headerIndex 导航条的索引
     * @author  : BinWatson
     * @version : v1.0
     * @date    : 2022-06-24 10:58:55
     * @details : 供Header.qml页面调用
     */
    Q_INVOKABLE void changePage(const int headerIndex);

    PluginHandler(QObject *parent = nullptr);

    static PluginHandler* instance();

public slots:
    void onAddPluginComplete();

signals:

    /**
     * @brief   : 当header改变后会触发该信号
     * @param   : index header的下标
     * @author  : BinWatson
     * @version : v1.0
     * @date    : 2022-06-24 10:59:59
     */
    void headerChanged(const int index);

    /**
     * @brief   : 页面更新信号，当该信号发送后，就说明需要更新显示页面
     * @param   : index 新页面的索引
     * @author  : BinWatson
     * @version : v1.0
     * @date    : 2022-06-05 10:59:58
     */
    void pageChanged(QQmlComponent* page);


private:
    /* 主页的按钮和导航条页面的映射关系 */
    QHash<int, int> m_btn2Header;
    QHash<int, int> m_header2Btn;
};

#endif // PLUGINHANDLER_H
